require(["config"], function(){
	require(["jquery", "template", "cookie", "load"], function($, template) {
		function Cart(){
			this.cart = [];//购物车cookie数据结构
			// 配置 cookie 自动在JS值与JSON值之间转换
			$.cookie.json = true;
			this.render();
			this.addListener();
		} 
		$.extend(Cart.prototype,{
			//渲染购物车
			render(){
				//获取cookie中保存的商品数据
				var cart = this.cart =$.cookie("cart") || [];
				//判断cookie中是否有商品
				if(cart.length === 0){
					$(".cart_empty").show();
					$(".cart_not_empty").hide();
					return;
				}else{
					$(".cart_empty").hide();
					$(".cart_not_empty").show();
				}
				//将读取到的cookie数据渲染到页面
				const html=template("cart-template",{cart:cart});
				console.log(html)
				$("#cart_body").html(html);
			},
			//添加事 件监听
			addListener(){
				//删除链接
				$("#cart_body").on("click",".del",$.proxy(this.delHandler, this));//或使用bind改变this指向
				//数量加减操作
				$("#cart_body").on("click",".decrement, .increment",$.proxy(this.modifyAmountHandler, this));
				//输入修改数量/文本框失去焦点事件处理
				$("#cart_body").on("blur",".amount",$.proxy(this.modifyAmountHandler, this));
				//全选
				$(".chk_all").on("click",this.chkAllHandler);
				//部分选中
				$("#cart_body").on("click", ".chk_prod", $.proxy(this.chkProdHandler, this));
				//计算合计金额事件
				$("#cart_body").on("click", ".chk_prod, .increment, .decrement, .del", this.calcTotalHandler);
				//点击全选后执行合计金额函数
				$(".chk_all").on("click",this.calcTotalHandler);
			},
			//处理删除
			delHandler(event){
				//获取行节点/通过筛选父节点获取
				const $tr=$(event.target).parents("tr");
				//待删除商品的id
				const id=$tr.find(".id").text();
				//将数组中当前删除的商品移除
				this.cart=this.cart.filter(curr=>curr.id!=id);//需要改变this指向，如果不改 this指向触发事件的事件源元素，并不是cookie数组
				//将修改后的数组存回cookie
				$.cookie("cart", this.cart ,{expires:10 , path:"/"});
				//获取cookie中保存的商品数据
				const cart = this.cart =$.cookie("cart") || [];
				//判断cookie中是否有商品
				if(cart.length === 0){
					$(".cart_empty").show();
					$(".cart_not_empty").hide();
					return;
				}else{
					$(".cart_empty").hide();
					$(".cart_not_empty").show();
				}
				//页面中删除行节点
				$tr.remove();
			},
			//处理修改数量
			modifyAmountHandler(event){
				//获取所在行，通过.parents筛选祖先节点
				const
					$src=$(event.target),
					$tr=$src.parents("tr");
				//获取当前修改数量的商品id
				const id = $tr.find(".id").text();
				//遍历cookie数组获取对应的商品对象，通过。filter（）方法筛选
				const prod = this.cart.filter(curr=>curr.id==id)[0];
				//修改数量 / is()判断方法
				if($src.is(".increment"))//加
					prod.amount++;
				else if($src.is(".decrement")){//减
					//判断数量小于1退出函数执行
					if(prod.amount <= 1)
						return;
						prod.amount--;
				}else if($src.is(".amount")){//输入修改数量
				//获取输入的value值
					const _amount=$src.val();
					console.log(_amount);
				//正则判断是否符合数字格式
					const reg=/^[1-9]\d*$/;
				//判断是否符合正则
					if(!reg.test(_amount)){
				//不符合还原原数据
						$src.val(prod.amount);
						return;
					}
					prod.amount=Number(_amount);
				}
				//保存cookie
				$.cookie("cart",this.cart,{expires:10,path:"/"});
				//显示修改后的数量
				$tr.find(".amount").val(prod.amount);
				//显示修改后的小计金额
				$tr.find(".sub").text((prod.price*prod.amount).toFixed(2));
			},
			//全选处理
			chkAllHandler(event){
				//获取全选复选框状态
				const status=$(event.target).prop("checked");
				//实现所有复选框选中
				$(".chk_prod").prop("checked",status);
			},
			//部分选中
			chkProdHandler(){
			//获取商品行前选中的复选框
			//:checked过滤选择器，能够过滤选中的复选框
				const count=$(".chk_prod:checked").length;
				//count===this.cart.length;当前选中与cookie数组长度相等表示全选
				//设置全选选中状态
				$(".chk_all").prop("checked",count===this.cart.length);
			},
			//计算合计金额
			calcTotalHandler(){
				//each（）方法遍历元素，函数中第一个参数为下标，第二个参数为元素对象
				let sum = 0;
				$(".chk_prod:checked").each((index, element)=>{
					sum += Number($(element).parents("tr").find(".sub").text());
				});
				$(".total").text(sum.toFixed(2));
			},
		});
		new Cart();
	});
});